資料庫準備就緒後,我們開始來蓋後端的地基。今天我們要在 Express 專案中,建立第一支用來抓取「寶可夢基礎圖鑑資料」的 API (/api/pokemon)。在這之前,我們先來探討為什麼大家都說要把 API 寫成 RESTful 風格。
我們在設計網址路由時,與其用動詞 (例如 /getPokemon, /addPokemon),RESTful 風格告訴我們應該用名詞來代表資源,並搭配 HTTP 動詞來表達動作。這種標準化可以讓前後端溝通更順暢:
| HTTP 動詞 | 路由範例 | 動作意義 | 成功狀態碼 (HTTP Status) |
|---|---|---|---|
| GET | /api/pokemon |
讀取所有寶可夢列表 | 200 OK |
| GET | /api/pokemon/25 |
讀取特定一隻 (皮卡丘) | 200 OK (若找不到則 404 Not Found) |
| POST | /api/pokemon |
新增一隻寶可夢 | 201 Created |
| PUT | /api/pokemon/25 |
完整覆寫這隻寶可夢的資料 | 200 OK |
| PATCH | /api/pokemon/25 |
部分修改 (例如只改屬性) | 200 OK |
| DELETE | /api/pokemon/25 |
刪除這隻寶可夢 | 204 No Content 或 200 OK |
我們建立 src/routes/pokemon.ts,用 GET 方法實作基礎的圖鑑撈取:
import { Router, Request, Response } from 'express';
import { db } from '../db';
const router = Router();
// GET /api/pokemon
router.get('/', async (req: Request, res: Response) => {
try {
const result = await db.execute('SELECT pokemon_id, name_zh, name_en, gender_type FROM pokemon');
res.json(result.rows);
} catch (error) {
console.error(error);
res.status(500).json({ error: 'Internal server error' });
}
});
export default router;
接著在 src/index.ts 註冊這個 Router:
import pokemonRoutes from './routes/pokemon';
app.use('/api/pokemon', pokemonRoutes);

使用 Postman 發送 GET 請求到
http://localhost:3000/api/pokemon,成功回傳 JSON 陣列資料的畫面。這代表您的後端與資料庫正式打通了!
我們成功寫出了符合 RESTful 風格的第一支 API!明天,我們將面對更進階的挑戰:設計儲存玩家「持有紀錄」的關聯式資料表,並了解 Foreign Key 的重要性。